package com.zliblike_platform.mapper;

import com.zliblike_platform.entity.Category;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * 分类Mapper接口
 */
@Mapper
public interface CategoryMapper {
    
    /**
     * 插入新分类
     * @param category 分类信息
     * @return 影响行数
     */
    int insertCategory(Category category);
    
    /**
     * 批量插入分类
     * @param categories 分类列表
     * @return 影响行数
     */
    int batchInsertCategories(List<Category> categories);
    
    /**
     * 更新分类信息
     * @param category 分类信息
     * @return 影响行数
     */
    int updateCategory(Category category);
    
    /**
     * 删除分类
     * @param categoryId 分类ID
     * @return 影响行数
     */
    int deleteCategory(Long categoryId);
    
    /**
     * 根据ID查询分类
     * @param categoryId 分类ID
     * @return 分类信息
     */
    Category selectCategoryById(Long categoryId);
    
    /**
     * 查询所有分类
     * @return 分类列表
     */
    List<Category> selectAllCategories();
    
    /**
     * 根据父ID查询子分类
     * @param parentId 父分类ID
     * @return 子分类列表
     */
    List<Category> selectCategoriesByParentId(Long parentId);
    
    /**
     * 查询一级分类（parentId=0）
     * @return 一级分类列表
     */
    List<Category> selectTopCategories();
    
    /**
     * 根据书籍ID查询关联的分类
     * @param bookId 书籍ID
     * @return 分类列表
     */
    List<Category> selectCategoriesByBookId(Long bookId);
    
    /**
     * 根据名称模糊查询分类
     * @param categoryName 分类名称
     * @return 分类列表
     */
    List<Category> selectCategoriesByName(@Param("categoryName") String categoryName);
    
    /**
     * 统计子分类数量
     * @param parentId 父分类ID
     * @return 子分类数量
     */
    int countSubCategories(Long parentId);
    
    /**
     * 批量删除分类
     * @param categoryIds 分类ID列表
     * @return 影响行数
     */
    int batchDeleteCategories(List<Long> categoryIds);

    @Select("")
    List<Category> selectAll();

    @Select("")
    Category selectById(Long categoryId);


    @Insert("")
    void insert(Category category);

    @Update("")
    void updateById(Category category);

    @Select("")
    Integer countBooksByCategory(Long categoryId);

    @Delete("")
    void deleteById(Long categoryId);
}